/*
实验6-2 关于堆的判断
分数 25
作者 陈越
单位 浙江大学

将一系列给定数字顺序插入一个初始为空的最小堆。随后判断一系列相关命题是否为真。命题分下列几种：

    x is the root：x是根结点；
    x and y are siblings：x和y是兄弟结点；
    x is the parent of y：x是y的父结点；
    x is a child of y：x是y的一个子结点。

输入格式：

每组测试第 1 行包含 2 个正整数 n（≤ 1000）和 m（≤ 20），分别是插入元素的个数、以及需要判断的命题数。下一行给出区间 [−10000,10000] 内的 n 个要被插入一个初始为空的最小堆的整数。之后 m 行，每行给出一个命题。题目保证命题中的结点键值都是存在的。
输出格式：

对输入的每个命题，如果其为真，则在一行中输出 T，否则输出 F。
输入样例：

5 4
46 23 26 24 10
24 is the root
26 and 23 are siblings
46 is the parent of 23
23 is a child of 10

输出样例：

F
T
F
T
*/

#include <iostream>
#include <vector>
#include <algorithm>
#include <regex>

using namespace std;

bool check_root(const vector<int>& heap, int x, int y) {
    return heap[0] == x;
}

bool check_sibling(const vector<int>& heap, int x, int y) {
    int idx_x = find(heap.begin(), heap.end(), x) - heap.begin();
    int idx_y = find(heap.begin(), heap.end(), y) - heap.begin();
    return abs(idx_x - idx_y) == 1 && (idx_x-1) / 2 == (idx_y-1) / 2;
}

bool check_parent(const vector<int>& heap, int x, int y) {
    int idx_x = find(heap.begin(), heap.end(), x) - heap.begin();
    int idx_y = find(heap.begin(), heap.end(), y) - heap.begin();
    return idx_x == (idx_y-1) / 2;
}

bool check_child(const vector<int>& heap, int x, int y) {
    return check_parent(heap, y, x);
}

struct Relation {
    regex re;
    bool (*check)(const vector<int>&, int, int);
};

Relation relations[] = {
    {regex("(-?\\d+) is the root"), check_root},
    {regex("(-?\\d+) and (-?\\d+) are siblings"), check_sibling},
    {regex("(-?\\d+) is the parent of (-?\\d+)"), check_parent},
    {regex("(-?\\d+) is a child of (-?\\d+)"), check_child}
};

int main() {
    int n, m;
    cin >> n >> m;
    vector<int> heap;
    for (int i = 0; i < n; i++) {
        int x;
        cin >> x;
        heap.push_back(x);
        push_heap(heap.begin(), heap.end(), greater<int>());
        // cin >> heap[i];
    }
    // make_heap(heap.begin(), heap.end(), greater<int>());

    cin.get(); // Skip the newline character
    for (int i = 0; i < m; i++) {
        string assign;
        getline(cin, assign);
        smatch matches;
        for (auto& r : relations) {
            if (regex_match(assign, matches, r.re)) {
                int x = stoi(matches[1].str());
                int y = matches.size() > 2 ? stoi(matches[2].str()) : 0;
                cout << (r.check(heap, x, y) ? "T" : "F") << endl;
                break;
            }
        }
    }

    return 0;
}